<?php

class UsersController extends AppController
{

    /**
     * Fonction de connexion d'un utilisateur
     */
    function enregistrer()
    {
        //Si des données sont envoyées
        if ($this->request->is('post'))
        {

            $d = $this->request->data; // on les stockent dans $d
            $d['User']['id'] = null; // On met l'id utilisateur à NULL pour éviter une faille de sécurité (forcer l'id)

            if (!empty($d['User']['password']))
            {
                $d['User']['password'] = Security::hash($d['User']['password'], null, true); //Si le mot de passe est renseigné on l'encrypte
            }
            if ($this->User->save($d, true, array('username', 'mail', 'password')))
            { //Si la sauvegarde dans la base de données réussi 
                // 
                //on envoie un mail d'activation avec un token 
                $link = array('controller' => 'users', 'action' => 'activate', $this->User->id . '-' . md5($d['User']['password'])); // le token prend la valeur de l'id utiisateur suive de son mot de passe encrypté en md5 (séparation "-" )

                App::uses('CakeEmail', 'Network/Email');
                $mail = new CakeEmail('gmail');
                $mail->from('no-reply@localhost.com')
                        ->to($d['User']['mail'])
                        ->subject("Bienvenue sur Capt'art")
                        ->emailFormat('html')
                        ->template('enregistrer')
                        ->viewVars(array('username' => $d['User']['username'], 'link' => $link))
                        ->send();

                // puis on affichage un message de réussite
                $this->Session->setFlash("Votre compte vient d'être crée. </br> Vous allez recevoir un email pour confirmer votre inscription.", 'notif');
            } else
            { // sinon on affichage un message de d'echec
                $this->Session->setFlash("Identifiants incorrects", "notif", array('type' => 'error'));
            }

            //on vide le champ mot de passe
            $this->request->data = array('User' => array('username' => $d['User']['username'], 'mail' => $d['User']['mail'], 'password' => ''));
        }
    }

    function deconnexion()
    {
        $this->Auth->logout();
        $this->redirect('/');
    }

    function connexion()
    {
        if ($this->request->is('post'))
        {
            if ($this->Auth->login())
            {
                $this->Session->setFlash("Vous êtes connecté", "notif");
                $this->redirect('/membre/photos/editer',404);
            } else
            {
                // Ajouter message erreur compte non actif
                $this->Session->setFlash("Identifiants incorrects", "notif", array('type' => 'error'));
            }
        }
    }

    /**
     * Vérification du token envoyé via le lien du mail et activation du compte utilisateur
     * @param type $token
     */
    function activate($token)
    {

        $token = explode('-', $token); // On récupère les champs d'origine contenu dans le token (id  -  password en md5)
        // on recupere de la BD l'utilisateur correspondant à l'id et au password du token et qui n'est pas encore actif
        $user = $this->User->find('first', array(
            'conditions' => array('id' => $token[0], 'MD5(User.password)' => $token[1], 'active' => 0)
        )); //
        // Si on a bien recuperer un utilisateur
        if (!empty($user))
        {
            $this->User->id = $user['User']['id'];
            $this->User->saveField('active', 1); // on passe le champ 'active' à 1 et on revoie un message de succès

            $this->Session->setFlash("Votre compte est désormais activé", "notif");
            $this->Auth->login($user['User']); // on ouvre une session pour l'utilisateur (obtention des droits membre)
        } else
        {
            // sinon on déclare le lien invalide
            $this->Session->setFlash("Ce lien d'activation n'est pas valide", "notif", array('type' => 'error'));
        }
        $this->redirect('/membre/users/editer'); // on redirige vers la page d'édition du profil(si l'utilisateur n'est pas membre il sera redirigé vers l'accueil)
        die();
    }

    function facebook()
    {
        echo'Salut';
        
        die('Heho');
        
        /*require APPLIBS . 'Facebook' . DS . 'facebook.php';
        $facebook = new Facebook(array(
            'app_Id' => '140884482754587',
            'secret' => '53e52c5993eda010c8e007cb7e57fc6a '
        ));
        $user = $facebook->getUser();
        debug($user);
        if ($user)
        {
            try
            {
                $infos = $facebook->api('/me');

                $v = $this->User->find('first', array(
                    'recursive' => -1,
                    'conditions' => array(
                        'facebook_id' => $infos ['id']
                    )
                ));

                if (!empty($v))
                {
                    $this->Auth->login($u['User']);
                    $this->redirect('/membre/users/editer');
                }

                if ($this->request->is('post'))
                {
                    $data = $this->request->data['User'];
                    $d = array(
                        'username' => $data['username'],
                        'facebook-id' => $infos ['id'],
                        'mail' => $infos ['email']
                    );

                    if ($this->User->save($d))
                    {
                        $this->Session->setFlash("Connecté", "notif");
                        $u = $this->User->read();
                        $this->Auth->login($u['User']);
                        $this->redirect('/membre/photos/editer');
                    } else
                    {
                        $this->Session->setFlash("Votre pseudo est déja utilisé", "notif", array('type' => 'error'));
                    }
                }
                $d = array();
                $d['user'] = $infos;
                $this->set($d);
            } catch (FacebookApiException $e)
            {
                $this->Session->setFlash("Impossible de récupérer vos informations" . $e->getCode() . "", "notif", array('type' => 'error'));
            }
        } else
        {
            $this->Session->setFlash("Erreur d'authentification Facebook", "notif", array('type' => 'error'));
            $this->redirect(array('action' => 'connexion'));
        }
         */
    }

    function password()
    {
        if (!empty($this->request->params['named']['token']))
        {
            $token = $this->request->params['named']['token'];
            $token = explode('-', $token); // On récupère les champs d'origine contenu dans le token (id  -  password en md5)
            // on recupere de la BD l'utilisateur correspondant à l'id et au password du token et qui n'est pas encore actif
            $user = $this->User->find('first', array(
                'conditions' => array('id' => $token[0], 'MD5(User.password)' => $token[1], 'active' => 1)
            )); //
            // Si on a bien recuperer un utilisateur
            if (!empty($user))
            {
                $this->User->id = $user['User']['id'];
                $password = substr(md5(uniqid(rand(), true)), 0, 10);
                $this->User->saveField('password', Security::hash($password, null, true));
                $link = array('controller' => 'users', 'action' => 'connexion');
                App::uses('CakeEmail', 'Network/Email');
                $mail = new CakeEmail('gmail');
                $mail->from('no-reply@localhost.com')
                        ->to($user['User']['mail'])
                        ->subject("Votre nouveau mot de passe")
                        ->emailFormat('html')
                        ->template('tmpmdp')
                        ->viewVars(array('username' => $user['User']['username'], 'link' => $link, 'pass' => $password))
                        ->send();
                $this->Session->setFlash("Votre mot de passe a bien été réinitialisé votre mot de passe temporaire vous a été communiqué par mail.", "notif");
            } else
            {
                $this->Session->setFlash("Ce lien n'est pas valide", "notif", array('type' => 'error'));
            }
        }

        if ($this->request->is('post'))
        {
            $c = current($this->request->data);
            $user = $this->User->find('first', array(
                'conditions' => array('mail' => $c['mail'], 'active' => 1)));

            if (empty($user))
            {
                $this->Session->setFlash("Aucun utilisateur ne correspond à ce mail. </br> Veuillez entrer l'adresse mail utilisée lors de votre inscription", "notif", array('type' => 'error'));
            } else
            {
                $link = array('controller' => 'users', 'action' => 'password', 'token' => $user['User']['id'] . '-' . md5($user['User']['password']));
                App::uses('CakeEmail', 'Network/Email');
                $mail = new CakeEmail('gmail');
                $mail->from('no-reply@localhost.com')
                        ->to($user['User']['mail'])
                        ->subject("Mot de passe oublié")
                        ->emailFormat('html')
                        ->template('mdp')
                        ->viewVars(array('username' => $user['User']['username'], 'link' => $link))
                        ->send();
                $this->Session->setFlash("Vous allez recevoir un e-mail pour confirmer votre réinitialisation de mot de passe.", "notif", array('type' => 'info'));
            }
        }
    }

    /**
     * Edition du profil d'un utilisateur (préfixage membre pour un acces seulement aux personnes logguer)
     */
    function membre_editer()
    {
        $user_id = $this->Auth->user('id'); // on stocke l'id de l'utilisateur 
        $user_inf = $this->User->find('first', array('conditions' => array('id' => $user_id), 'fields' => array('password', 'nom', 'prenom'))); //et on stocke ses informations avant la modification

        $this->User->id = $user_id; //On redefinit le même id pour éviter une faille de sécurité
        $passError = false;
        $oldpassError = false;

        if ($this->request->is('put') || $this->request->is('post'))
        { // Si des informations sont postées  
            $d = $this->request->data;
            $d['User']['id'] = $user_id; //On redefinit encore le même id par sécurité


            if (!empty($d['User']['oldpass']))
            { // Si le champ ancien mot de passe est rempli
                if (Security::hash($d['User']['oldpass'], null, true) == $user_inf['User']['password'])
                { // On vérifie qu'il est bien identique à celui en base sinon on affiche un msg d'erreur
                    if (!empty($d['User']['pass1']))
                    { // Si le champ nouveau mot de passe est rempli
                        if ($d['User']['pass1'] == $d['User']['pass2'])
                        {  // On vérifie qu'il est bien identique à celui de confirmation sinon on affiche un msg d'erreur
                            $d['User']['password'] = Security::hash($d['User']['pass2'], null, true); // Si OK on redefinie le mot de paase
                        } else
                        {
                            $passError = true; // boolean pour msg d'erreur
                        }
                    }
                } else
                {
                    $oldpassError = true; // boolean pour msg d'erreur
                }
            }


            // Si il n'y a pas de modification d'une des information  on affiche un msg
            if (($d['User']['nom'] == $user_inf['User']['nom']) && ($d['User']['prenom'] == $user_inf['User']['prenom']) && empty($d['User']['oldpass']) && empty($d['User']['pass1']))
            {
                $this->Session->setFlash("Aucune modification de vos informations", "notif", array('type' => 'info'));
            } else
            {
                // sinon si il n'y a pas d'erreur on enregistre les changements en base puis msg de succes
                if (!$passError && !$oldpassError)
                {
                    if ($this->User->save($d, true, array('nom', 'prenom', 'password')))
                    {
                        $this->Session->setFlash("Modifications enregistrées", "notif");
                    } else
                    {
                        $this->Session->setFlash("Erreur impossible d'enregistrer les modifications veuillez réessayer ultérieurement.", "notif", array('type' => 'error'));
                    }
                    if ($oldpassError)
                    { //Affichage de l'erreur sur l'ancien mot de passe 
                        $this->User->validationErrors['oldpass'] = array("Mauvais mot de passe");
                    } else if ($passError)
                    { //Affichage de l'erreur sur le nouveau mot de passe 
                        $this->User->validationErrors['pass2'] = array("Les mots de passe ne correspondent pas.");
                    }
                }
            }
        } else
        {// Si aucune information n'est envoyée (premier acces à la page) récupère les informations déjà en base 
            $this->request->data = $this->User->read();
        }
        $this->request->data['User']['oldpass'] = $this->request->data['User']['pass1'] = $this->request->data['User']['pass2'] = ''; // Dans tous les cas on vide les champs mot de passe une fois une action achevée
    }

}